package mylab.io.base.context;

import mylab.io.base.Das;
import mylab.io.base.DasEventCallback;
import mylab.io.base.cache.DasCache;
import mylab.io.base.model.Msg;
import mylab.io.base.property.DasProperties;
import mylab.io.base.sync.Synchro;
import mylab.utils.common.guava.AsyncEventUtil;

public interface DasContext<P extends DasProperties, M extends Msg> extends DasEventCallback<M> {

    public static <P extends DasProperties, M extends Msg> DasContext<P, M> newContext(P params) {
        return new DefaultDC<>(params);
    }

    default void init(Das<?, P, M> das) {
        AsyncEventUtil.register(this);
    }

    default void dispose() {
        AsyncEventUtil.unregister(this);
    }

    P getDasPropertites();

    Das<?, P, M> getDas();

    DasCache getDasCache();

    Synchro getSynchro();
}
